"use strict";
// /* 
//   接口的作用: 在面向对象的编成中，接口是一种规范的定义，它定义了行为和动作的规范，在程序设计里面，接口起到一种限制和规范的作用。
//   接口定义了某一批类所需要遵守的规范，接口不关心这些类的内部状态数据，也不关心这些类里方法的实现细节，它只规定这批类里必须提供
//   某些方法，提供这些方法的类就可以满足实际需要。typescript中的接口类似于java，同时还增加了更灵活的接口类型，包括属性、函数、可
//   索引和类等。
// */
// /* 
//   ts中定义方法传入参数，对json进行约束
// */
// // function printLabel(labelInfo: { label: string }): void {
// //   console.log('printLabel')
// // }
// // printLabel('hahah') /** 错误写法 **/
// // printLabel({name: '张三'}) /** 错误写法 **/
// // printLabel({ label: '张三' }) /** 正确的写法 **/
// // 接口：行为和动作的规范，对批量方法进行约束
// //  就是传入对象的约束  属性接口
// /* interface FullName {
//   firstName: string; // 注意 " ; " 号结束哦 但是我测试了不下 分号 也不会报错
//   secondName: string;
// }
// function PrintName(name: FullName) {
//   // 必须传入对象 firstName secondName
//   console.log(name.firstName + '--' + name.secondName)
// }
// let obj = { // 传入的参数包含 firsName secondName 
//   age: 20,
//   firstName: '张',
//   secondName: '三'
// }
// PrintName(obj) 
// // PrintName({ firstName: '张', secondName: '三', age: 20}) // 但是这样写age会报错 */
// // 接口的可选属性
// // interface FullName {
// //   firstName: string;
// //   secondName?: string;
// // }
// // function getName(name: FullName) {
// //   alert(JSON.stringify(name))
// // }
// // getName({ firstName: 'firstName' })
// /** 函数类型的接口 **/
// // 函数类型接口：对方法传入的参数  以及返回值进行约束
// // 加密的函数型接口
// // interface encrypt {
// //   (key: string, value: string): string;
// // }
// // let md5: encrypt = function(key: string, value: string): string {
// //   // 模拟操作
// //   return key + value
// // }
// // console.log(md5('name', 'zhanhgsan'))
// /**  可索引接口 **/
// // 数组对象的约束 (不常用)
// interface UserArr {
//   [index: number]: string
// }
// // let arr: UserArr = ['aa','bb']
// // console.log(arr)
// // let arr: UserArr = [123, 'bbb'] // 报错
// // console.log(arr)
// // 可索引接口  对对象的约束
// // interface UserObj {
// //   [index: string]: string
// // }
// // let arr: UserObj = { name: '张三' }
// // // 类类型接口：对类的约束 和 抽象类有点相似
// // interface Animal {
// //   name: string;
// //   eat(str: string): void;
// // }
// // class Dog implements Animal {
// //   name: string
// //   constructor(name: string) {
// //     this.name = name
// //   }
// //   eat() {
// //     console.log(this.name + '吃粮食')
// //   }
// // }
// // let d = new Dog('小黑')
// // d.eat()
// // 接口扩展：接口可以继承接口
// interface Animal {
//   eat(): void;
// }
// interface Person extends Animal {
//   work(): void;
// }
// class Programmer {
//   public name: string
//   constructor(name: string) {
//     this.name = name
//   }
//   coding(code: string) {
//     console.log(this.name + code)
//   }
// }
// class Web extends Programmer implements Person {
//   constructor(name: string) {
//     super(name)
//   }
//   eat() {
//     console.log(this.name + '喜欢吃馒头')
//   }
//   work() {
//     console.log(this.name + '写代码')
//   }
// }
// const programmer_person = new Web('吴超 ')
// programmer_person.work()
// programmer_person.coding('敲代码')
// programmer_person.eat()
